home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 23
/
AACD 23.iso
/
AACD
/
Games
/
dynAMIte
/
Developer
/
C
/
BotFrame.c
next >
Wrap
C/C++ Source or Header
|
2001-06-24
|
2KB
|
128 lines
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <exec/semaphores.h>
#include <dos/dos.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include "dynamite.h"
BOOL checkDynamite (struct dynamitesemaphore ** );
void mainLoop (struct dynamitesemaphore *);
void doAI (struct dynamitesemaphore *);
int
main (void)
{
struct dynamitesemaphore *dynasema;
srand (time(NULL));
if ( FALSE == checkDynamite (&dynasema) )
{
puts ("*** DynAMIte not running!");
return EXIT_FAILURE;
}
/* some information */
printf ("Number of clients: %Ld\n",dynasema->opencnt);
/* enter main loop */
mainLoop (dynasema);
/* decrease opencount to tell dynamite that you no
longer need the semaphore. dynamite will remove the
semaphore only if opencnt is 0 at the end */
ObtainSemaphore(&dynasema->sema);
dynasema->opencnt--;
ReleaseSemaphore(&dynasema->sema);
return EXIT_SUCCESS;
}
BOOL
checkDynamite (struct dynamitesemaphore ** dynasema )
{
Forbid(); /* try to find the semaphore */
if (*dynasema = (struct dynamitesemaphore *)FindSemaphore ("dynAMIte.0")
{
/* increase opencount to tell dynamite that you are using the
semaphore. dynamite will remove semaphore only if opencnt is
0 at its end */
++ dynasema->opencnt;
}
Permit();
if ( NULL == *dynasema )
return FALSE;
return TRUE;
}
void
mainLoop (struct dynamitesemaphore * dynasema)
{
struct player *ourplayer;
BOOL done = FALSE,
delay;
while (FALSE == done)
{
if (CheckSignal (SIGBREAKF_CTRL_C))
done = TRUE;
else
{
delay = TRUE;
ObtainSemaphore (&dynasema->sema);
if (dynasema->quit)
{
/* dynamite wants to quit, so we do dynamite a favour */
printf ("dynAMIte is about to quit...\n");
done = TRUE;
}
else
{
/* if a game is running */
if (dynasema->gamerunning>=GAME_GAME)
{
/* and player is no observer */
if (dynasema->thisplayer < 8)
{
delay = FALSE;
ourplayer = dynasema->players[dynasema->thisplayer];
/* and our player is alive */
if (ourplayer->dead)
doAI (dynasema);
}
}
}
ReleaseSemaphore (&dynasema->sema);
if (delay)
{
/* no game is running */
/* do a small delay to let the cpu do other things :( */
Delay (10);
}
}
}
}
void
doAI (struct dynamitesemaphore * dynasema)
{
dynasema->walk = rand() % DIR_UP+1;
}